import Vue from "vue"
import config from "./config.js"
/*
 * 1.如果想让方法挂载到Vue原型，把方法名放到funList里面
 * 2.想要单独调用就放在...暂未开发
 */

/**
 * 返回上一页
 * @param {Number} delta 返回的页数
 */
function $back(delta) {
	uni.navigateBack({
		delta
	});
}

function $navigateTo(url) {
	uni.navigateTo({
		url
	})
}

/**
 * toast轻提示
 * status=0  不显示图标
 * status=1  显示成功图标
 * status=2  显示错误图标
 * status=3  显示错误图标
 * status=4  显示异常图标
 * status=5  显示加载图标
 * @param {String} title 提示信息
 */
function $toast(title, status = 0) {
	if (!title) return console.error("必须传入提示语");
	uni.showToast({
		title,
		icon: status == 5 ? "loading" : status == 1 ? "success" : status == 2 ? "error" : status == 3 ? "fail" :
			status == 4 ? "exception" : "none"
	})
}

/**
 * 检测手机号
 * @param phone 手机号
 * @returns {boolean}   合法为true
 */
function $regPhone(phone) {
	let reg = /^1[3456789]\d{9}$/;
	if (reg.test(phone.trim())) {
		return true;
	} else {
		return false;
	}
}

let $getTime = (time, type = 0) => {
	let myDate;
	if (Number(time) && time > 0) myDate = new Date(time * 1000)
	else myDate = new Date();
	let year = myDate.getFullYear();
	let mon = myDate.getMonth() + 1;
	mon = mon > 10 ? mon : '0' + mon;
	let day = myDate.getDate();
	day = day > 10 ? day : '0' + day;
	const hour = myDate.getHours()
	const minute = myDate.getMinutes()
	const second = myDate.getSeconds()
	switch (type) {
		case 0:
			return year + '-' + mon + '-' + day;
			break;
		case 1:
			return year + '-' + mon + '-' + day + ' ' + hour + ':' + minute;
			break;
	}
}

function $getUserInfo() {
	const userinfo = uni.getStorageSync('userinfo')
	return userinfo
}

let funList = {
	$back,
	$getTime,
	$toast,
	$navigateTo,
	$regPhone, // 检测手机号
	$getUserInfo,
}

Object.keys(funList).forEach(item => {
	Vue.prototype[item] = funList[item]
})

/**
 * 格式化日期格式 (用于兼容ios Date对象)
 */
export const formatDate = (time) => {
	// 将xxxx-xx-xx的时间格式，转换为 xxxx/xx/xx的格式 
	return time.replace(/\-/g, "/");
}

/**
 * 对象转URL
 * @param {object} obj
 */
export const urlEncode = (obj = {}) => {
	const result = []
	for (const key in obj) {
		const item = obj[key]
		if (!item) {
			continue
		}
		if (isArray(item)) {
			item.forEach(val => {
				result.push(key + '=' + val)
			})
		} else {
			result.push(key + '=' + item)
		}
	}
	return result.join('&')
}

/**
 * 遍历对象
 */
export const objForEach = (obj, callback) => {
	Object.keys(obj).forEach((key) => {
		callback(obj[key], key)
	});
}

/**
 * 是否在数组内
 */
export const inArray = (search, array) => {
	for (var i in array) {
		if (array[i] == search) return true
	}
	return false
}

/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * 月(Y)、月(m)、日(d)、小时(H)、分(M)、秒(S) 可以用 1-2 个占位符，
 * 例子：dateFormat('YYYY-mm-dd HH:MM:SS', new Date()) ==> 2020-01-01 08:00:00
 */
export const dateFormat = (fmt, date) => {
	const opt = {
		"Y+": date.getFullYear().toString(), // 年
		"m+": (date.getMonth() + 1).toString(), // 月
		"d+": date.getDate().toString(), // 日
		"H+": date.getHours().toString(), // 时
		"M+": date.getMinutes().toString(), // 分
		"S+": date.getSeconds().toString() // 秒
		// 有其他格式化字符需求可以继续添加，必须转化成字符串
	}
	let ret
	for (let k in opt) {
		ret = new RegExp("(" + k + ")").exec(fmt)
		if (ret) {
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
		}
	}
	return fmt
}

/**
 * 判断是否为空对象
 * @param {*} object 源对象
 */
export const isEmptyObject = (object) => {
	return Object.keys(object).length === 0
}

/**
 * 判断是否为对象
 * @param {*} object
 */
export const isObject = (object) => {
	return Object.prototype.toString.call(object) === '[object Object]'
}

/**
 * 判断是否为数组
 * @param {*} array
 */
export const isArray = (array) => {
	return Object.prototype.toString.call(array) === '[object Array]'
}

/**
 * 判断是否为空
 * @param {*} object 源对象
 */
export const isEmpty = (value) => {
	if (isArray(value)) {
		return value.length === 0
	}
	if (isObject(value)) {
		return isEmptyObject(value)
	}
	return !value
}

/**
 * 对象深拷贝
 * @param {*} obj 源对象
 */
export const cloneObj = (obj) => {
	let newObj = isArray(obj) ? [] : {};
	if (typeof obj !== 'object') {
		return;
	}
	for (let i in obj) {
		newObj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i];
	}
	return newObj
}

// 节流函数
// 思路： 第一次先设定一个变量true，
// 第二次执行这个函数时，会判断变量是否true，
// 是则返回。当第一次的定时器执行完函数最后会设定变量为flase。
// 那么下次判断变量时则为flase，函数会依次运行。
export function throttle(fn, delay = 100) {
	// 首先设定一个变量，在没有执行我们的定时器时为null
	var timer = null
	return function() {
		// 当我们发现这个定时器存在时，则表示定时器已经在运行中，需要返回
		if (timer) return
		timer = setTimeout(() => {
			fn.apply(this, arguments)
			timer = null
		}, delay)
	}
}

// 防抖函数
// 首次运行时把定时器赋值给一个变量， 第二次执行时，
// 如果间隔没超过定时器设定的时间则会清除掉定时器，
// 重新设定定时器， 依次反复， 当我们停止下来时，
// 没有执行清除定时器， 超过一定时间后触发回调函数。
// 参考文档：https://segmentfault.com/q/1010000021145192
export function debounce(fn, delay = 100) {
	let timer
	return function() {
		const that = this
		const _args = arguments // 存一下传入的参数
		if (timer) {
			clearTimeout(timer)
		}
		timer = setTimeout(function() {
			fn.apply(that, _args)
		}, delay)
	}
}

/**
 * 数组交集
 * @param {Array} 数组1
 * @param {Array} 数组2
 * @return {Array}
 */
export const arrayIntersect = (array1, array2) => {
	return array1.filter(val => array2.indexOf(val) > -1)
}

/**
 * 获取当前客户端的rpx比值
 * @return {Number}
 */
export const rpx = () => {
	const { windowWidth } = uni.getSystemInfoSync()
	// #ifdef H5
	// 与pages.json文件中的 rpxCalcMaxDeviceWidth参数对应, 请勿修改
	const rpxCalcMaxDeviceWidth = 750
	// 与pages.json文件中的 rpxCalcBaseDeviceWidth参数对应, 请勿修改
	const rpxCalcBaseDeviceWidth = 560
	const calcWindowWidth = windowWidth > rpxCalcMaxDeviceWidth ? rpxCalcBaseDeviceWidth : windowWidth
	return calcWindowWidth / 750
	// #endif
	// #ifndef H5
	return windowWidth / 750
	// #endif
}

/**
 * 获取当前客户端的rpx比值
 * @return {Number}
 */
export const rpx2px = (num) => {
	return num * rpx()
}

// 时间戳转年月日 默认格式yyyy-MM-dd
export const tsToDateFormat = (timestamp, separator = '-') => {
	const dateObj = new Date(timestamp) // 创建Date对象
	const year = dateObj.getFullYear() // 获取年份
	const month = ("0" + (dateObj.getMonth() + 1)).slice(-2) // 获取月份，并补零
	const day = ("0" + dateObj.getDate()).slice(-2) // 获取日期，并补零
	return `${year}${separator}${month}${separator}${day}` // 返回转换后的日期格式
}

// 时间戳转年月日时分秒 默认格式yyyy-MM-dd HH:mm:ss
export const tsToDateAndTime = (timestamp, separator = '-', sep2 = ':', sep3 = ' ') => {
	const dateObj = new Date(timestamp) // 创建Date对象
	const year = dateObj.getFullYear() // 获取年份
	const month = ("0" + (dateObj.getMonth() + 1)).slice(-2) // 获取月份，并补零
	const day = ("0" + dateObj.getDate()).slice(-2) // 获取日期，并补零
	const hour = ('0' + dateObj.getHours()).slice(-2);
	const minute = ('0' + dateObj.getMinutes()).slice(-2);
	const second = ('0' + dateObj.getSeconds()).slice(-2);
	return `${year}${separator}${month}${separator}${day}${sep3}${hour}${sep2}${minute}${sep2}${second}`
}

// 状态码 => 状态文案 1=审核中 2=已拒绝 3=已打款 4=待财务审核 5=待打款
export const getStatusTxt = (status) => {
	if (status == '1') return '审核中'
	else if (status == '2') return '已拒绝'
	else if (status == '3') return '已打款'
	else if (status == '4') return '待财务审核'
	else if (status == '5') return '待打款'
	return '未知状态'
}

// 上传图片
export const uploadImg = (url, tempFilePaths, yes, no) => {
	// 上传图片
	uni.uploadFile({
		url, // 开发者服务器 url
		filePath: tempFilePaths, // 要上传文件资源的路径
		name: 'file', // 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
		formData: {
			// HTTP 请求中其他额外的 form data （即接口需要的其它参数）
		},
		success(res) {
			console.log('uploadFile.success', res)
			yes(res)
		},
		fail() {
			console.log('uploadImg.fail', err)
			no(err)
		},
		complete() {
			console.log('uploadImg.complete')
		},
	})
}